package com.mopon.springbootmvc;

import org.springframework.aop.framework.AopContext;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

import com.mopon.springbootmvc.dao.IUserDao;

/**
 * spring boot静态资源
 * 1.src/main/webapp目录下，就可以直接访问
 * 2.默认的静态资源的路径是classpath:[/META-INF/resources/, /resources/, /static/, /public/]
 * 可以通过配置项spring.resources.staticLocations修改默认静态资源路径
 * 
 * spring boot中使用servlet的API
 * 方法一：(servlet3可以使用注解)
 * 1.编写servlet，加上相应的注解@WebServlet("/user.do")
 * 2.需要启用@ServletComponentScan注解
 * 
 * 方法二：(servlet2.5及以下版本可以使用这种方法)
 * 1.编写servlet
 * 2.装配相应的bean到spring容器中
 * servlet -> ServletRegistrationBean
 * filter -> FilterRegistrationBean
 * listener -> ServletListenerRegistrationBean
 * 
 * 
 * 拦截器的使用步骤
 * 1.写一个拦截器，实现HandlerInterceptor接口
 * 2.写一个类，继承WebMvcConfigurerAdapter抽象类，然后重写addInterceptors方法，把自定义的拦截器加进去
 * 
 * 
 * 异常处理
 * 如何去掉spring boot默认的异常处理逻辑
 * @SpringBootApplication(exclude=ErrorMvcAutoConfiguration.class)
 * 
 * 使用CommonErrorPageRegistry方法
 * 写一个类，实现CommonErrorPageRegistry接口，然后实现registerErrorPages方法，在该方法里面，添加具体的错误处理逻辑
 * 如：CommonErrorPageRegistry
 * 
 * 
 * 全局异常处理
 * 1.写一个类，需要加上@ControllerAdvice注解
 * 2.写一个异常处理方法，方法上面加上@ExceptionHandler(value = Exception.class)注解
 * 
 * 
 * aop开发流程
 * 1.加入spring-boot-starter-aop依赖，默认开启了aop的支持
 * 2.写一个Aspect，封装横切关注点(日志、监控等)，需要配置通知和切入点@Before("execution(* com.mopon.springbootmvc.dao..*.*(..))")
 * 3.这个Aspect需要纳入到spring容器中
 * 
 * spring.aop.auto=true  默认启用(AopAutoConfiguration)
 * spring.aop.proxy-target-class=false 默认使用jdk动态代理，但如果类没有实现接口，还是使用cglib。使用动态代理之后，需要使用接口获取类的对象
 * spring.aop.proxy-target-class=true  使用cglib
 * 
 * 默认aop在pom中引入包之后就自动开启了，但还是可以使用注解@EnableAspectJAutoProxy(exposeProxy=true)，exposeProxy值为true，表示
 * 可以使用AopContext.currentProxy().getClass() 获取到代理后的对象
 * 
 * @author galen.zhang
 *
 */
@EnableAspectJAutoProxy(exposeProxy=true)
@ServletComponentScan
@SpringBootApplication
public class WebApplication {

	public static void main(String[] args) {
		ConfigurableApplicationContext context = SpringApplication.run(WebApplication.class, args);
		System.out.println(context.getBean(IUserDao.class).getClass());
		context.getBean(IUserDao.class).add("zhangs", "123456");;
		context.close();
	}

	/**
	 * 
	 * 方法用途: jetty容器中缺少EmbeddedServletContainerFactory类<br>
	 * 实现步骤: <br>
	 * @return
	 */
//	@Bean
//	public JettyEmbeddedServletContainerFactory servletContainer() {
//        JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory();
//        return factory;
//    }
}
